using System;
using UnityEngine;
using UnityEngine.UIElements;

public class Weapon : MonoBehaviour
{
    public int id; // 武器/子弹的ID
    public int prefabId; // 武器/子弹预制体的ID
    public float damage; // 武器/子弹的伤害值
    public int count; // 发射武器/子弹的数量
    public float speed; // 武器旋转的速度
    float timer;
    Player player;

    void Awake()
    {
        player = GameManager.instance.player;
        // Init(); // 初始化武器属性
    }

    void Update()
    {
        if(!GameManager.instance.isLive) return;
        switch (id)
        {
            case 0:
                transform.Rotate(Vector3.back, speed * Time.deltaTime); // 绕z轴旋转武器
                break;
            default:
                timer += Time.deltaTime;
                if (timer > speed && count > 0)
                {
                    timer = 0f;
                    Fire();
                }
                break;
        }

        //测试
        // if (Input.GetKeyDown(KeyCode.Space))
        // {
        //     LevelUp(10, 1);
        // }
    }

    public void LevelUp(float damage, int count)
    {
        this.damage = damage * Character.Damage;
        this.count += count;
        if (id == 0) Batch();
    }

    /// <summary>
    /// 初始化武器/子弹属性
    /// </summary>
    public void Init(ItemData data)
    {
        name = "Weapon " + data.itemId; // 设置物品名称
        transform.parent = player.transform; // 设置物品的父级为玩家对象
        transform.localPosition = Vector3.zero; // 设置物品在父级坐标系下的本地位置为(0, 0, 0)
        id = data.itemId; // 设置物品ID
        damage = data.baseDamage * Character.Damage; // 设置物品基础伤害
        count = data.baseCount + Character.Count; // 设置物品基础数量

        for (int index = 0; index < GameManager.instance.pool.prefabs.Length; index++)
        {
            if (data.projectile == GameManager.instance.pool.prefabs[index])
            {
                prefabId = index; // 设置投射物的预制体ID
                break;
            }
        }
        switch (id)
        {
            case 0:
                speed = 150 * Character.WeaponSpeed; // 设置武器旋转的速度
                Batch();
                break;
            default:
                speed = 0.5f * Character.WeaponRate;
                break;
        }
        Hand hand = player.hands[(int)data.itemType];
        hand.spriter.sprite = data.hand;
    }

    /// <summary>
    /// 批量配置武器属性
    /// </summary>
    void Batch()
    {
        for (int index = 0; index < count; index++)
        {
            Transform bullet;
            if (index < transform.childCount)
            {
                bullet = transform.GetChild(index);
            }
            else
            {
                bullet = GameManager.instance.pool.Get(prefabId).transform;// 从对象池中获取武器预制体的实例
                bullet.parent = transform;// 设置武器的父级为武器
            }
            bullet.localPosition = Vector3.zero;
            bullet.localRotation = Quaternion.identity;

            Vector3 rotvec = Vector3.forward * 360 * index / count; // 计算武器的旋转角度，使其均匀分布在圆周上
            bullet.Rotate(rotvec); // 设置武器的旋转角度
            bullet.Translate(bullet.up * 1.5f, Space.World); // 将武器沿着自身的y轴方向向前移动一定距离

            bullet.GetComponent<Bullet>().Init(damage, -1, Vector3.zero); // 初始化武器的属性
        }
    }

    // 发射子弹
    void Fire()
    {
        if (!player.scanner.nearestTarget) return; // 如果玩家的扫描器没有最近的目标，直接返回

        Vector3 targetPos = player.scanner.nearestTarget.position; // 获取最近目标的位置
        Vector3 dir = targetPos - transform.position; // 计算从当前位置指向目标位置的方向向量
        dir = dir.normalized; // 将方向向量归一化，使其成为单位向量

        Transform bullet = GameManager.instance.pool.Get(prefabId).transform; // 从对象池中获取一个子弹对象
        bullet.position = transform.position; // 设置子弹的初始位置为当前位置
        bullet.rotation = Quaternion.FromToRotation(Vector3.up, dir); // 将子弹的朝向调整为指向目标位置的方向
        bullet.GetComponent<Bullet>().Init(damage, count, dir); // 初始化子弹的伤害值、穿透次数和初始速度方向

        AudioManager.instance.PlaySfx(AudioManager.Sfx.Range);
    }
}
